<?php

// 模板类
class Templates {
    // 
    private $_vars = array();
    private $_config = array();

    // 创建一个构造方法，来验证各个目录是否存在
    public function __construct() {
        if (!is_dir(TPL_DIR) || !is_dir(TPL_C_DIR) || !is_dir(CACHE)) {
            exit('ERROR: 模板目录或编译目录或缓存目录不存在！请手工设置！');
        }
        // 保存系统变量
        $_sxe = simplexml_load_file(ROOT_PATH . '/config/profile.xml');
        $_tagLib = $_sxe->xpath('/root/taglib');
        foreach ($_tagLib as $_tag) {
            $_tag = (array) $_tag;
            $this->_config[$_tag['name']] = $_tag['value'];
        }
    }

    // assign方法，注入变量
    public function assign($_var, $_value) {
        // $_var用于同步模板里的变量名
        // $_value值表示的是index.php里的$_name的值
        if (isset($_var) && !empty($_var)) {
            $this->_vars[$_var] = $_value;
        } else {
            exit('ERROR: 请设置模板变量');
        }
    }

    // display
    public function display($_file) {
        // 设置模板的路径
        $_tplFile = TPL_DIR . $_file;
        if (!file_exists($_tplFile)) {
            exit('ERROR: 模板文件不存在！');
        }
        // 编译文件
        $_parFile = TPL_C_DIR . md5($_file) . $_file . '.php';
        // 缓存文件
        $_cacheFile = CACHE . md5($_file) . $_file . '.html';
        // 当第二次运行相同文件的时候，直接载入缓存文件，避开编译
        if (IS_CACHE) {
            // 缓存文件和编译文件都要存在
            if (file_exists($_cacheFile) && file_exists($_parFile)) {
                if (filemtime($_parFile) >= filemtime($_tplFile) && filemtime($_cacheFile) >= filemtime($_cacheFile)) {
                    include $_cacheFile;
                    return;
                }
            }
        }
        // 当编译文件不存在，或模板文件修过时间大于编译文件修改时间时，则生成编译文件
        if (!file_exists($_parFile) || filemtime($_parFile) < filemtime($_tplFile)) {
            // 引入模板解析类
            require ROOT_PATH . '/includes/Parser.class.php';
            $_parser = new Parser($_tplFile);
            $_parser->compile($_parFile);
        }
        // 载入编译文件
        include $_parFile;
        if (IS_CACHE) {
            // 获取缓冲区内的数据，并且创建缓存文件
            file_put_contents($_cacheFile, ob_get_contents());
            // 清楚缓冲区(清除了编译文件加载的内容))
            ob_end_clean();
            // 载入缓存文件
            include $_cacheFile;
        }
    }
}

?>